DAL Create of Insert methode
Home

DAL Create of Insert methode

DAL Create of Insert methode

De Create of Insert methode voor de DAL klasse

Probleem

  1. We hebben de id van de nieuw toegevoegde rij nodig.
  2. We willen geen dubbele namen.

We willen feedback geven aan de gebruiker over de insert. Er zijn drie toestanden die we in de gaten moeten houden:

  1. database foutmelding
  2. sql foutmelding
  3. insert gelukt

Design

We gebruiken een try catch om feedback te geven op systeemfouten en SQL server fouten. We interpreteren de retourwaarde van de ExecuteNonQuery methode. Als parameter geven we een BLL object mee. In ASP.NET MVC is dat vaak het model. Als de naam van de EventCategory al bestaat zal er een SQL foutmelding gegenereerd worden (-100).

Oplossing

Voeg de Create methode toe in de EventCategory Dal klasse:

public int Create(Bll.EventCategory bll)
{
    MySqlConnection connection = new MySqlConnection(this.connectionString);
    // in de CommandText parameter geven we de naam van de stored procedure mee
    MySqlCommand command = new MySqlCommand("EventCategoryInsert", connection);
    // zeg aan het command object dat het een stored procedure
    // zal krijgen en geen SQL Statement
    command.CommandType = CommandType.StoredProcedure;
    // voeg de parameters toe die aan de stored procedure doorgegeven moeten worden
    MySqlParameter pName = new MySqlParameter();
    pName.ParameterName = "pName";
    pName.DbType = DbType.String;
    pName.Value = bll.Name;
    command.Parameters.Add(pName);
    MySqlParameter pId = new MySqlParameter();
    pId.ParameterName = "pId";
    pId.DbType = DbType.Int32;
    // om de out parameter van de stored procedure op te vangen
    // die stuurt de Id van de nieuw toegevoegde rij terug
    pId.Direction = ParameterDirection.Output;
    command.Parameters.Add(pId);

    Message = "Niets te melden";
    // we gaan ervan uit dat het mislukt
    int result = 0;
    using (connection)
    {
        try
        {
            connection.Open();
            //Verbinding geslaagd
            result = command.ExecuteNonQuery();
            // we moeten kijken naar de waarde van out parameter
            // van Insert stored procedure. Als de naam van de
            // category al bestaat, retourneert de out parameter van
            // de stored procedure
            // -1
            if ((int)pId.Value == -100)
            {
                Message = $"De categorie met de naam {bll.Name} bestaat al!";
                result = -100;
            }
            else if (result <= 0)
            {
                Message = $"De categorie met de naam {bll.Name} kon niet worden geïnserted!";
                this.message = "EventCategory is niet geïnserted.";
            }
            else
            {
                Message = $"De categorie met de naam {bll.Name} is geïnserted!";
                result = (int)pId.Value;
            }
        }
        catch (MySqlException e)
        {
            this.message = e.Message;
        }
    }
    // 0 of de Id van de nieuwe rij of -100 als de naam van de categorie al bestaat
    return result;
}

Kopiëer die methode in de EventCategory DAL klasse.

Testen

  1. Voeg de ReadOne methode toe in IDal:
    using System.Collections.Generic;
    namespace FricFrac.Dal
    {
        interface IDal<T>
        {
            string Message { get; }
            int RowCount { get; }
            List<T> ReadAll();
            T ReadOne(int id);
            int Create(T bll);
        }
    }
    
  2. Vervolledig de methode FricFracDalTest in het bestand Learning.cs:
    public static void FricFracDalTest()
    {
        Console.WriteLine(" Fric-frac DAL test");
        FricFrac.Dal.EventCategory dal = new FricFrac.Dal.EventCategory();
        List<FricFrac.Bll.EventCategory> list = dal.ReadAll();
        Console.WriteLine($" {dal.RowCount} {dal.Message}");
        foreach (FricFrac.Bll.EventCategory item in list)
            Console.WriteLine(" {0} {1}", item.Id, item.Name);
        FricFrac.Bll.EventCategory bll = new FricFrac.Bll.EventCategory();
        bll = dal.ReadOne(4);
        Console.WriteLine($" {dal.RowCount} {dal.Message}");
        bll = dal.ReadOne(200);
        // we lezen een bestaande categorie in
        bll = dal.ReadOne(6);
        Console.WriteLine($" {dal.RowCount} {dal.Message}");
        // we proberen deze gevonden categorie weer toe te voegen
        dal.Create(bll);
        Console.WriteLine($" {dal.RowCount} {dal.Message}");
        // we wijzigen de naam van de categorie
        bll.Name = "Hackathon Programmeren";
        // En proberen die toe te voegen
        dal.Create(bll);
        Console.WriteLine($" {dal.RowCount} {dal.Message}");
    }
  3. Roep de methode op in Program.cs:
    using System;
    
    namespace AdoDotNet
    {
        class Program
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("Leren werken met ADO.NET in .NET Core!");
                // Learning.TestMySqlConnector();
                // Learning.ReflectPropertiesTryOut();
                // Learning.LearnDotNetCoreConfigurationApi();
                Learning.FricFracDalTest();
                Console.ReadKey();
            }
        }
    }
  4. En dat is het resultaat:
    Visual Studio Result Test ADO.NET DAL Create
    Visual Studio Result Test ADO.NET DAL Create

JI
2017-09-15 17:14:57